(function(window){
	// 引入构造函数 F
	var arr=[],
		push=arr.push,
		slice=arr.slice;

// 对外公开的函数, 但是原型与构造函数相同,
//  而且 constructor 也是该函数
// 因此 Icreate 函数也是构造函数
function Icreate(selector){
	return new Icreate.fn.init( selector );
}

// 原型的设置(核心成员)
Icreate.fn =Icreate.prototype = {
	constructor: Icreate,
	length:0,
	init:function(selector){

		// 传入的如果是 0, '', nulll, undefined
		if(!selector) return this;

 		// 获得元素, 设置 this 
 		//push.apply(this,Icreate.select(selector));
 		if( typeof selector == 'string' ) {
 			//选择器 或 HTML字符串（'<div></div>'）
 			//第一个非空白字符，如果是 < 那么就是标签，
 			//方法一：
 			//trim,charAt(0) == '<'
 			//方法二：
 			//正则表达式
 			//var r = /^\s*</;===匹配第一个非空字符串
 			if ( /^\s*</.test( selector ) ) {
 				push.apply( this, Icreate.parseHTML( selector ));
 			} else {
 				//选择器
 				push.apply( this, Icreate.select(selector ));
 			}
 			return this;
 		}
 		
 		
 		
 		
	},

}

// 共享原型
Icreate.fn.init.prototype = Icreate.fn;

// 添加扩展方法
Icreate.extend =Icreate.fn.extend =function(obj){
	for(var k in obj){
		this[k]=obj[k];
	}
	return this;
}



// 已经写好的工具方法

Icreate.extend({
	select : function(selector){
		return document.querySelectorAll(selector);
	},
	isArrayLike:function(obj){
		if(Object.prototype.toString.call(obj) == '[object Array]'){
			return true;
		}
		var length ='length' in obj && obj.length;
		return typeof length ==='number' && length >=0;
	},
	each :function(arr,callback){
		if(Icreate.isArrayLike(arr)){
			for(var i=0;i<arr.length;i++){
				if(callback.call(arr[i],i,arr[i]) === false) break;
			}
		}else{
			for(var k in arr){
				if(callback.call(arr[k],k,arr[k]) === false) break;
			}
		}
		return arr;
	},
	map : function(arr,callback){
		var newArr=[], tmp;
		if(Icreate.isArrayLike(arr)){
			for( var i=0;i<arr.length;i++){
				tmp=callback(arr[i],i);
				if(tmp!=null){
					newArr.push(tmp);
				}
			}
		}else{
			for(var k in arr){
				tmp=callback(arr[k],k);
				if(tmp!=null){
					newArr.push(tmp);
				}
			}
		}
		return newArr;
	}
});



Icreate.fn.extend({
	each: function (callback) {
		return Icreate.each(this,callback);
	},
	map: function (callback) {
		return Icreate.map(this,callback);
	}
})


// 添加核心方法
Icreate.fn.extend({
	toArray:function(){
		// 要返回的是数组, 而且是 由 this 中的每一个 dom 元素所组成 的数组
        // 方案1
        // var arr = [];
        // for ( var i = 0; i < this.length; i++ ) {
        //     arr.push( this[ i ] );
        // }
        // return arr;

        // 方案2
        // return this.map(function ( v ) {
        //     return v;
        // });
        

        // 方案3
        return slice.call(this);

	},
	get:function(index){
		if(index === undefined){
			return this.toArray();
		};
		if(index<0){
			return this[this.length + index];
		}else{
			return this[index];
		}
	},


	eq:function(index){
		var iobj=this.constructor();
		if(index == null) return iobj;
		var dom=this.get(index);
		if(dom){
			iobj[0]=dom;
			iobj.length=1;
		}
		return iobj;
	},

	first:function(){
		return this.eq(0);
	},
	last:function(){
		return this.eq(-1);
	}




})









window.Icreate =window.I =Icreate;

})(window);






















